package 其他.盛最多水的容器11;

/**
 * 解决盛最多水的容器问题的解决方案类
 */
public class Solution {
    /**
     * 计算可以盛最多水的容器的面积
     *
     * @param height 一个整数数组，表示每个位置的垂直线的高度
     * @return 返回可以盛最多的水量
     */
    public int maxArea(int[] height) {
        // 初始化最大面积为0
        int ans = 0;
        // 初始化左指针为数组起始位置
        int left = 0;
        // 初始化右指针为数组结束位置
        int right = height.length - 1;

        // 当左指针小于右指针时，进行循环
        while(left < right){
            // 找出当前左右指针指向的垂直线中的较短者
            int min = Math.min(height[left], height[right]);
            // 计算当前左右指针形成的容器的面积
            int area = (right - left) * min;
            // 更新最大面积
            ans = Math.max(ans, area);

            // 移动指针以寻找可能的更大容器
            if(height[left] < height[right]){
                // 移动左指针，直到找到一个比当前较短垂直线高的位置
                while(left < right && height[left] <= min){
                    left++;
                }
            }
            else{
                // 移动右指针，直到找到一个比当前较短垂直线高的位置
                while(left < right && height[right] <= min){
                    right--;
                }
            }
        }

        // 返回最大面积
        return ans;
    }
}
